﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IBatisNet.DataMapper;
using StateGrid.OperationLog;

namespace StateGrid.ZWQK
{
    /// <summary>
    /// 中文期刊数据库简单操作。
    /// </summary>
    public class ZWQK_DAO
    {
        private ISqlMapper sqlMapper = Mapper.Instance();
        private OperationLog_DAO logDao = new OperationLog_DAO();
        /// <summary>
        /// 获取所有中文期刊分类信息。
        /// </summary>
        /// <returns></returns>
        public IList<ZWQK_FL> getAllZwqkFL()
        {
            return sqlMapper.QueryForList<ZWQK_FL>("SelectAllZWQK_FL", null);
        }
        /// <summary>
        /// 获取所有中文期刊索引目录信息。
        /// </summary>
        /// <returns></returns>
        public IList<ZWQK_SYML> getAllZwqkSYML()
        {
            return sqlMapper.QueryForList<ZWQK_SYML>("SelectAllZWQK_SYML", null);
        }
        /// <summary>
        /// 获取所有中文期刊篇名信息。
        /// </summary>
        /// <returns></returns>
        public IList<ZWQK_PM> getAllZwqkPM()
        {
            return sqlMapper.QueryForList<ZWQK_PM>("SelectAllZWQK_PM", null);
        }
        /// <summary>
        /// 获取一部分中文期刊分类信息。
        /// 起始结果行从1开始。最后结果包含结束行。
        /// 例如start=1,end=2，则返回第1行和第2行共2个结果。
        /// 结果排序按主键分类编号。
        /// </summary>
        /// <param name="start">起始结果行</param>
        /// <param name="end">结束结果行</param>
        /// <returns></returns>
        public IList<ZWQK_FL> getSomeZwqkFL(int start, int end)
        {
            IDictionary<String, int> para = new Dictionary<String, int>();
            para.Add("start", start);
            para.Add("end", end);
            return sqlMapper.QueryForList<ZWQK_FL>("SelectSomeZWQK_FL", para);
        }
        /// <summary>
        /// 获取一部分中文期刊索引目录信息。
        /// 起始结果行从1开始。最后结果包含结束行。
        /// 例如start=1,end=2，则返回第1行和第2行共2个结果。
        /// 结果排序按主键索引编号。
        /// </summary>
        /// <param name="start">起始结果行</param>
        /// <param name="end">结束结果行</param>
        /// <returns></returns>
        public IList<ZWQK_SYML> getSomeZwqkSYML(int start, int end)
        {
            IDictionary<String, int> para = new Dictionary<String, int>();
            para.Add("start", start);
            para.Add("end", end);
            return sqlMapper.QueryForList<ZWQK_SYML>("SelectSomeZWQK_SYML", para);
        }
        /// <summary>
        /// 获取一部分中文期刊篇名信息。
        /// 起始结果行从1开始。最后结果包含结束行。
        /// 例如start=1,end=2，则返回第1行和第2行共2个结果。
        /// 结果排序按主键文件名。
        /// </summary>
        /// <param name="start">起始结果行</param>
        /// <param name="end">结束结果行</param>
        /// <returns></returns>
        public IList<ZWQK_PM> getSomeZwqkPM(int start, int end)
        {
            IDictionary<String, int> para = new Dictionary<String, int>();
            para.Add("start", start);
            para.Add("end", end);
            return sqlMapper.QueryForList<ZWQK_PM>("SelectSomeZWQK_PM", para);
        }
        /// <summary>
        /// 检索索引目录表。
        /// </summary>
        /// <param name="flbm">限定的分类编码。精确匹配。null或空字符串为不设条件。</param>
        /// <param name="zwmc">限定的索引中文名称。模糊匹配。null或空字符串为不设条件。</param>
        /// <param name="start">返回结果的起始序号。</param>
        /// <param name="end">返回结果的结束序号。</param>
        /// <returns></returns>
        public IList<ZWQK_SYML> queryZwqkSYML(String flbm, String zwmc, int start, int end)
        {
            if (zwmc!=null && zwmc.Trim().Length>0)
                zwmc = '%'+zwmc+'%';
            IDictionary<String, Object> para = new Dictionary<String, Object>();
            para.Add("start", start);
            para.Add("end", end);
            para.Add("queryFlbm", flbm);
            para.Add("queryZwmc", zwmc);
            return sqlMapper.QueryForList<ZWQK_SYML>("SelectSomeZWQK_SYML", para);
        }
        /// <summary>
        /// 获取以某个条件检索索引目录表的结果总数数目。
        /// </summary>
        /// <param name="flbm">限定的分类编码。精确匹配。null或空字符串为不设条件。</param>
        /// <param name="zwmc">>限定的索引中文名称。模糊匹配。null或空字符串为不设条件。</param>
        /// <returns></returns>
        public int countQueryZwqkSYML(String flbm, String zwmc)
        {
            if (zwmc != null && zwmc.Trim().Length > 0)
                zwmc = '%' + zwmc + '%';
            IDictionary<String, Object> para = new Dictionary<String, Object>();
            para.Add("queryFlbm", flbm);
            para.Add("queryZwmc", zwmc);
            return sqlMapper.QueryForObject<int>("CountSomeZWQK_SYML", para);
        }
        /// <summary>
        /// 获取指定索引编码的篇名。
        /// </summary>
        /// <param name="sybm">指定的索引编码。空或null表示无限制。</param>
        /// <param name="start">返回结果的起始序号。</param>
        /// <param name="end">返回结果的结束序号。</param>
        /// <returns></returns>
        public IList<ZWQK_PM> queryZwqkPM(String sybm, int start, int end) 
        {
            IDictionary<String, Object> para = new Dictionary<String, Object>();
            para.Add("start", start);
            para.Add("end", end);
            para.Add("querySybm", sybm);
            return sqlMapper.QueryForList<ZWQK_PM>("SelectSomeZWQK_PM", para);
        }

        public int countQueryZwqkPM(String sybm)
        {
            IDictionary<String, Object> para = new Dictionary<String, Object>();
            para.Add("querySybm", sybm);
            return sqlMapper.QueryForObject<int>("CountSomeZWQK_PM", para);
        }

        /// <summary>
        /// 根据分类编码字符串获取分类信息。
        /// </summary>
        /// <param name="flbm"></param>
        /// <returns></returns>
        public ZWQK_FL getZwqkFLByFlbm(String flbm)
        {
            return sqlMapper.QueryForObject<ZWQK_FL>("SelectZWQK_FLByFlbm", flbm);
        }
        /// <summary>
        /// 根据索引编码获取索引目录信息。
        /// </summary>
        /// <param name="sybm"></param>
        /// <returns></returns>
        public ZWQK_SYML getZwqkSYMLBySybm(String sybm)
        {
            return sqlMapper.QueryForObject<ZWQK_SYML>("SelectZWQK_SYMLBySybm", sybm);
        }
        /// <summary>
        /// 根据文件名获取篇名信息。
        /// </summary>
        /// <param name="wjm"></param>
        /// <returns></returns>
        public ZWQK_PM getZwqkPMByWjm(String wjm)
        {
            return sqlMapper.QueryForObject<ZWQK_PM>("SelectZWQK_PMByWjm", wjm);
        }
        /// <summary>
        /// 根据分类编码删除分类信息。
        /// </summary>
        /// <param name="flbm">删除的行数。</param>
        public int deleteZwqkFLByFlbm(String flbm)
        {
            return sqlMapper.Delete("DeleteZWQK_FLByFlbm", flbm);
        }
        /// <summary>
        /// 根据索引编码删除索引目录信息。
        /// </summary>
        /// <param name="sybm">删除的行数</param>
        public int deleteZwqkSYMLBySybm(String sybm)
        {
            return sqlMapper.Delete("DeleteZWQK_SYMLBySybm", sybm);
        }
        /// <summary>
        /// 根据文件名删除中文期刊篇名信息。
        /// </summary>
        /// <param name="wjm">删除的行数</param>
        public int deleteZwqkPMByWjm(String wjm)
        {
            return sqlMapper.Delete("DeleteZWQK_PMByWjm", wjm);
        }
        /// <summary>
        /// 插入中文期刊分类信息。
        /// </summary>
        /// <param name="fl"></param>
        public bool insertZwqkFL(ZWQK_FL fl)
        {
            bool result = false;
            try
            {
                sqlMapper.Insert("InsertZWQK_FL", fl);
                result = true;
            }
            catch
            {
                Console.WriteLine("插入中文期刊分类失败");
            }
            return result;
        }
        /// <summary>
        /// 插入中文期刊索引目录信息。
        /// </summary>
        /// <param name="syml"></param>
        public bool insertZwqkSYML(ZWQK_SYML syml)
        {
            bool result = false;
            try
            {
                sqlMapper.Insert("InsertZWQK_SYML", syml);
                result = true;
            }
            catch
            {
                Console.WriteLine("插入中文期刊索引目录失败");
            }
            return result;

        }
        /// <summary>
        /// 插入中文期刊篇名信息。
        /// </summary>
        /// <param name="pm"></param>
        public bool insertZwqkPM(ZWQK_PM pm)
        {
            bool result = false;
            try
            {
                sqlMapper.Insert("InsertZWQK_PM", pm);
                result = true;
            }
            catch (Exception e)
            {
                Console.WriteLine("插入中文期刊篇名失败：" + e.Message);
            }
            return result;
        }
        /// <summary>
        /// 插入中文期刊篇名同时进行日志记录。
        /// </summary>
        /// <param name="pm"></param>
        /// <param name="opMode">操作模式，表示是否批量。SINGLE或BATCH。</param>
        public bool insertAndLogZwqkPM(ZWQK_PM pm, String opMode)
        {
            //插入
            bool result = insertZwqkPM(pm);

            if (result)
            {
                //构造插入的日志
                OperationLogItem logItem = new OperationLogItem();
                logItem.opDate = DateTime.Now;
                logItem.opBookIn = pm.sybm + "_" + pm.nf + "_" + pm.qh;
                logItem.opMode = opMode;
                logItem.opObjectID = pm.wjm;
                logItem.opPageCount = pm.ys;
                if (pm.dlr == null)
                    logItem.opPerson = "UNKNOWN";
                else
                    logItem.opPerson = pm.dlr;
                logItem.opTable = "ZWQK_PM";
                logItem.opType = "ADD";

                logDao.insertLogItem(logItem);
            }

            return result;
        }
        /// <summary>
        /// 更新索引目录信息。
        /// 索引编码为主键。
        /// </summary>
        /// <param name="syml"></param>
        /// <returns></returns>
        public bool updateZwqkSYML(ZWQK_SYML syml)
        {
            bool result;
            try
            {
                sqlMapper.BeginTransaction();
                deleteZwqkSYMLBySybm(syml.sybm);
                insertZwqkSYML(syml);
                sqlMapper.CloseConnection();
                result = true;
            }
            catch
            {
                sqlMapper.RollBackTransaction();
                result = false;
            }
            return result;
        }
        /// <summary>
        /// 更新分类信息。
        /// 分类编码为主键。
        /// </summary>
        /// <param name="fl"></param>
        /// <returns></returns>
        public bool updateZwqkFL(ZWQK_FL fl)
        {
            bool result;
            try
            {
                sqlMapper.BeginTransaction();
                deleteZwqkFLByFlbm(fl.flbm);
                insertZwqkFL(fl);
                sqlMapper.CloseConnection();
                result = true;
            }
            catch
            {
                sqlMapper.RollBackTransaction();
                result = false;
            }
            return result;
        }
        /// <summary>
        /// 更新篇名信息。
        /// 文件名为主键。
        /// </summary>
        /// <param name="pm"></param>
        /// <returns></returns>
        public bool updateZwqkPM(ZWQK_PM pm)
        {
            bool result;
            try
            {
                sqlMapper.BeginTransaction();
                deleteZwqkPMByWjm(pm.wjm);
                insertZwqkPM(pm);
                sqlMapper.CloseConnection();
                result = true;
            }
            catch (Exception e)
            {
                sqlMapper.RollBackTransaction();
                result = false;
                Console.WriteLine("更新篇名信息出错：" + e.Message);
            }
            return result;
        }
        /// <summary>
        /// 更新篇名信息。文件名为主键。
        /// 更新成功同时记录日志。
        /// </summary>
        /// <param name="pm"></param>
        /// <returns></returns>
        public bool updateAndLogZwqkPM(ZWQK_PM pm)
        {
            bool result = updateZwqkPM(pm);
            //插入成功，记录日志。
            if (result)
            {
                OperationLogItem logItem = new OperationLogItem();
                logItem.opDate = DateTime.Now;
                logItem.opBookIn = pm.sybm + "_" + pm.nf + "_" + pm.qh;
                logItem.opMode = "SINGLE";
                logItem.opObjectID = pm.wjm;
                logItem.opPageCount = pm.ys;
                if (pm.dlr == null)
                    logItem.opPerson = "UNKNOWN";
                else
                    logItem.opPerson = pm.dlr;
                logItem.opTable = "ZWQK_PM";
                logItem.opType = "EDIT";

                logDao.insertLogItem(logItem);
            }
            return result;
        }
        /// <summary>
        /// 修改已有的文件名。
        /// </summary>
        /// <param name="oldWjm">旧文件名</param>
        /// <param name="newWjm">新文件名</param>
        /// <returns>是否修改成功</returns>
        public bool changeZwqkPMWjm(String oldWjm, String newWjm)
        {
            IDictionary<String, Object> para = new Dictionary<String, Object>();
            para.Add("oldwjm", oldWjm);
            para.Add("newwjm", newWjm);
            bool result;
            try
            {
                sqlMapper.Update("ChangeZWQK_PM_wjm", para);
                result = true;
            }
            catch
            {
                result = false;
            }
            return result;
        }
    }
}
